import {JoinColumnOptions} from "../decorator/options/JoinColumnOptions";
import {RelationType} from "../metadata/types/RelationTypes";
import {JoinTableMultipleColumnsOptions} from "../decorator/options/JoinTableMultipleColumnsOptions";
import {DeferrableType} from "../metadata/types/DeferrableType";
import {OnDeleteType} from "../metadata/types/OnDeleteType";
import {OnUpdateType} from "../metadata/types/OnUpdateType";
import {JoinTableOptions} from "../index";

export interface EntitySchemaRelationOptions {

    /**
     * Indicates with which entity this relation is made.
     */
    target: Function|string;

    /**
     * Type of relation. Can be one of the value of the RelationTypes class.
     */
    type: RelationType;

    /**
     * Inverse side of the relation.
     */
    inverseSide?: string;

    /**
     * Indicates if this relation will be lazily loaded.
     */
    lazy?: boolean;

    /**
     * Indicates if this relation will be eagerly loaded.
     */
    eager?: boolean;

    /**
     * Indicates if persistence is enabled for the relation.
     * By default its enabled, but if you want to avoid any changes in the relation to be reflected in the database you can disable it.
     * If its disabled you can only change a relation from inverse side of a relation or using relation query builder functionality.
     * This is useful for performance optimization since its disabling avoid multiple extra queries during entity save.
     */
    persistence?: boolean;

    /**
     * Indicates if this relation will be a primary key.
     * Can be used only for many-to-one and owner one-to-one relations.
     */
    primary?: boolean;

    /**
     * Join table options of this column. If set to true then it simply means that it has a join table.
     */
    joinTable?: boolean|JoinTableOptions|JoinTableMultipleColumnsOptions;

    /**
     * Join column options of this column. If set to true then it simply means that it has a join column.
     */
    joinColumn?: boolean|JoinColumnOptions;

    /**
     * Indicates if this is a parent (can be only many-to-one relation) relation in the tree tables.
     */
    treeParent?: boolean;

    /**
     * Indicates if this is a children (can be only one-to-many relation) relation in the tree tables.
     */
    treeChildren?: boolean;

    /**
     * If set to true then it means that related object can be allowed to be inserted / updated / removed to the db.
     * This is option a shortcut if you would like to set cascadeInsert, cascadeUpdate and cascadeRemove to true.
     */
    cascade?: boolean|("insert"|"update"|"remove")[];

    /**
     * Default database value.
     */
    default?: any;

    /**
     * Indicates if relation column value can be nullable or not.
     */
    nullable?: boolean;

    /**
     * Database cascade action on delete.
     */
    onDelete?: OnDeleteType;

    /**
     * Database cascade action on update.
     */
    onUpdate?: OnUpdateType;

    /**
     * Indicate if foreign key constraints can be deferred.
     */
    deferrable?: DeferrableType;

}
